package com.zhaokuner.parentstarter.common;


import com.zhaokuner.parentstarter.enumeration.SuperCodeMsg;
import com.zhaokuner.parentstarter.resultcode.SuperResultCodeUtil;
import lombok.Data;

/**
 * 类描述:api 返回结果
 *
 * @author 赵希坤 zhaoxikun
 * @date 2020/12/10 18:39
 */
@Data
public class ResultData<T> {
    /**
     * 错误码
     */
    private Integer code;

    /**
     * 提示信息
     */
    private String msg;

    /**
     * 具体数据
     */
    private T data;

    protected ResultData() {

    }

    /**
     * 构造成功包体
     *
     * @return 成功的包体
     */
    public static <T> ResultData<T> newInstance(SuperCodeMsg resultCode, T data) {
        return makeResult(resultCode.getCode(), resultCode.getMsg(), data);
    }

    /**
     * 构造成功包体
     *
     * @return 成功的包体
     */
    public static <T> ResultData<T> success() {
        return makeResult(SuperResultCodeUtil.SUCCESS.getCode(), SuperResultCodeUtil.SUCCESS.getMsg(), null);
    }

    /**
     * 构造成功的包体
     *
     * @param data 包体中data的内容
     * @return 成功的包体
     */
    public static <T> ResultData<T> success(T data) {
        return makeResult(SuperResultCodeUtil.SUCCESS.getCode(), SuperResultCodeUtil.SUCCESS.getMsg(), data);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @return 失败的包体
     */
    public static <T> ResultData<T> error(SuperCodeMsg result) {
        return makeResult(result.getCode(), result.getMsg(), null);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @param data   包体内容
     * @return 失败的包体
     */
    public static <T> ResultData<T> error(SuperCodeMsg result, T data) {
        return makeResult(result.getCode(), result.getMsg(), data);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @return 失败的包体
     */
    public static <T> ResultData<T> error(SuperCodeMsg result, String msg) {
        return makeResult(result.getCode(), msg, null);
    }

    /**
     * 构造调用失败的包体
     *
     * @param result 错误码和提示信息内容
     * @param data   包体内容
     * @return 失败的包体
     */
    public static <T> ResultData<T> error(SuperCodeMsg result, String msg, T data) {
        return makeResult(result.getCode(), msg, data);
    }

    private static <T> ResultData<T> makeResult(Integer code, String msg, T data) {
        ResultData<T> result = new ResultData<T>();
        result.setCode(code);
        result.setMsg(msg);
        if (data != null) {
            result.setData(data);
        }
        return result;
    }


}
